#ifndef MODEL3D_H_
#define MODEL3D_H_

#include <vector>
#include "Point.h"
#include "Cube.h"
#include "CasosBase.h"
#include "Triangle.h"

//Contiene las celdas y los puntos (triangulos) de un cubo, y las funciones principales del alrogitmo.
class Model3D
{
private:
	std::vector <Triangle> _triangles;
	int _lastIndex;

public:
	Model3D();

	void insertTriangle(Triangle newTriangle);
	void addTriangles(int casoBase, Cube rotatedCube, int rotx, int roty, int rotz,float umbral);

	//getters
	std::vector <Triangle> getTriangles();
	 Triangle getTriangle(int i);

	 void updatePosition(int initialVertex[3]);

	//funciones que calculan las intersecciones dependiendo del caso base
	void addTrianglesCasoBase1(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int ijk [3]);
	void addTrianglesCasoBase2(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase3(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase4(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase5(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase6(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase7(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase8(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase9(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase10(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase11(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase12(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase13(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);
	void addTrianglesCasoBase14(std::vector<Point> possibleIntersectionPoints, int rotx, int roty, int rotz, int * ijk);

	//Funcion que calcula las intersecciones para los 12 aristas de un cubo según el umbral.
	std::vector<Point> calculateInterpolated12Points(Cube cube, double umbral);

};

#endif
